home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / progsrc / v3dt090 / mode13h.asm < prev    next >
Encoding:
Assembly Source File  |  1994-11-01  |  50.1 KB  |  2,463 lines

  1. ;       mode13h v0.90ß released 11-01-94
  2. ;
  3. ;       32 bit mode 13h graphics routines
  4. ;       by Voltaire/OTM 
  5. ;       Copyright (C) 1994 Zach Mortensen
  6. ;
  7. ;       email -
  8. ;       mortens1@nersc.gov
  9. ;
  10. ;       NOTE  - These routines are designed to operate in the FLAT MEMORY
  11. ;       MODEL ONLY!  Therefore, you HAVE to be using protected mode to use
  12. ;       them.  If you're writing 32 bit code and NOT using protected mode,
  13. ;       you should be slapped for your laziness and lack of foresight.
  14. ;       Go spend $200 and buy Watcom C++ v10.0, it ROCKS, and it comes with
  15. ;       DOS4GW, Rational Systems' 32 bit DOS extender.  Will these routines
  16. ;       work with Tran's PMODE?  I DON'T KNOW.  I picked up Tran's code long
  17. ;       ago and found it impossible to use from within C++.  I write all of
  18. ;       my code in C++ with the exception of speed critical things like
  19. ;       graphics primitives, and extremely low level code such as sound
  20. ;       routines, which I do in assembler; so I never really gave PMODE
  21. ;       much of a chance (sorry, Tran).
  22. ;
  23. ;       DISCLAIMER - I am not an assembler programmer.  I do not profess to
  24. ;       be an assembler programmer.  This code is all original.  This code
  25. ;       is all assembler.  Therefore, this code CONTAINS SOME BUGS.  I AM
  26. ;       AWARE OF THAT.  If you find any (and you will), please let me know.
  27. ;       As far as optimization goes, I'm sure I've done a few things wrong
  28. ;       here and there, but on the whole this is some pretty fast code.  If
  29. ;       you have any ideas on how to further optimize, please let me know
  30. ;       as well.
  31. ;
  32.  
  33.  
  34.         .386p
  35.  
  36.         .code
  37.  
  38. ; Data goes here (in the CODE segment?!?!  AAAAAAAAARRRGH!!)
  39.  
  40.  
  41.         vidSeg          dd      000A0000h
  42.         virtPage        dd      ?
  43.         curPage         dd      ?
  44.  
  45.         ; data for the triangle routines
  46.  
  47.         lEdge           dd      200 dup(0)
  48.         rEdge           dd      200 dup(0)
  49.         lColor          dd      200 dup(0)
  50.         rColor          dd      200 dup(0)
  51.  
  52.         xTop            dd      0
  53.         yTop            dd      0
  54.         cTop            dd      0
  55.         xMid            dd      0
  56.         yMid            dd      0
  57.         cMid            dd      0
  58.         xBot            dd      0
  59.         yBot            dd      0
  60.         cBot            dd      0
  61.  
  62.         rCount          dd      0
  63.  
  64.         xBres           dd      0
  65.         yBres           dd      0
  66.         cBres           dd      0
  67.  
  68.         dxdy            dd      0
  69.  
  70.         ; stuff for the regHline routine
  71.  
  72.         color           dd      0
  73.         scanLine        dd      0
  74.         rhlColor        dd      0
  75.  
  76.         ; for tDrawBitmap routine
  77.  
  78.         sPos            dd      0
  79.         dPos            dd      0
  80.         xOffset         dd      0
  81.         yOffset         dd      0
  82.         oWidth          dd      0       ; original width
  83.         oHeight         dd      0       ; original height
  84.         nWidth          dd      0       ; new width
  85.         nHeight         dd      0       ; new height
  86.  
  87.         ; table of colors (dwords) so we don't have to calculate them
  88.         ; every time
  89.  
  90.         ; I never could get this to work the way I wanted it to...;)
  91.  
  92. dwColor dd 000000000h
  93.     dd 001010101h, 002020202h, 003030303h, 004040404h
  94.     dd 005050505h, 006060606h, 007070707h, 008080808h
  95.     dd 009090909h, 00A0A0A0Ah, 00B0B0B0Bh, 00C0C0C0Ch
  96.     dd 00D0D0D0Dh, 00E0E0E0Eh, 00F0F0F0Fh, 010101010h
  97.     dd 011111111h, 012121212h, 013131313h, 014141414h
  98.     dd 015151515h, 016161616h, 017171717h, 018181818h
  99.     dd 019191919h, 01A1A1A1Ah, 01B1B1B1Bh, 01C1C1C1Ch
  100.     dd 01D1D1D1Dh, 01E1E1E1Eh, 01F1F1F1Fh, 020202020h
  101.     dd 021212121h, 022222222h, 023232323h, 024242424h
  102.     dd 025252525h, 026262626h, 027272727h, 028282828h
  103.     dd 029292929h, 02A2A2A2Ah, 02B2B2B2Bh, 02C2C2C2Ch
  104.     dd 02D2D2D2Dh, 02E2E2E2Eh, 02F2F2F2Fh, 030303030h
  105.     dd 031313131h, 032323232h, 033333333h, 034343434h
  106.     dd 035353535h, 036363636h, 037373737h, 038383838h
  107.     dd 039393939h, 03A3A3A3Ah, 03B3B3B3Bh, 03C3C3C3Ch
  108.     dd 03D3D3D3Dh, 03E3E3E3Eh, 03F3F3F3Fh, 040404040h
  109.     dd 041414141h, 042424242h, 043434343h, 044444444h
  110.     dd 045454545h, 046464646h, 047474747h, 048484848h
  111.     dd 049494949h, 04A4A4A4Ah, 04B4B4B4Bh, 04C4C4C4Ch
  112.     dd 04D4D4D4Dh, 04E4E4E4Eh, 04F4F4F4Fh, 050505050h
  113.     dd 051515151h, 052525252h, 053535353h, 054545454h
  114.     dd 055555555h, 056565656h, 057575757h, 058585858h
  115.     dd 059595959h, 05A5A5A5Ah, 05B5B5B5Bh, 05C5C5C5Ch
  116.     dd 05D5D5D5Dh, 05E5E5E5Eh, 05F5F5F5Fh, 060606060h
  117.     dd 061616161h, 062626262h, 063636363h, 064646464h
  118.     dd 065656565h, 066666666h, 067676767h, 068686868h
  119.     dd 069696969h, 06A6A6A6Ah, 06B6B6B6Bh, 06C6C6C6Ch
  120.     dd 06D6D6D6Dh, 06E6E6E6Eh, 06F6F6F6Fh, 070707070h
  121.     dd 071717171h, 072727272h, 073737373h, 074747474h
  122.     dd 075757575h, 076767676h, 077777777h, 078787878h
  123.     dd 079797979h, 07A7A7A7Ah, 07B7B7B7Bh, 07C7C7C7Ch
  124.     dd 07D7D7D7Dh, 07E7E7E7Eh, 07F7F7F7Fh, 080808080h
  125.     dd 081818181h, 082828282h, 083838383h, 084848484h
  126.     dd 085858585h, 086868686h, 087878787h, 088888888h
  127.     dd 089898989h, 08A8A8A8Ah, 08B8B8B8Bh, 08C8C8C8Ch
  128.     dd 08D8D8D8Dh, 08E8E8E8Eh, 08F8F8F8Fh, 090909090h
  129.     dd 091919191h, 092929292h, 093939393h, 094949494h
  130.     dd 095959595h, 096969696h, 097979797h, 098989898h
  131.     dd 099999999h, 09A9A9A9Ah, 09B9B9B9Bh, 09C9C9C9Ch
  132.     dd 09D9D9D9Dh, 09E9E9E9Eh, 09F9F9F9Fh, 0A0A0A0A0h
  133.     dd 0A1A1A1A1h, 0A2A2A2A2h, 0A3A3A3A3h, 0A4A4A4A4h
  134.     dd 0A5A5A5A5h, 0A6A6A6A6h, 0A7A7A7A7h, 0A8A8A8A8h
  135.     dd 0A9A9A9A9h, 0AAAAAAAAh, 0ABABABABh, 0ACACACACh
  136.     dd 0ADADADADh, 0AEAEAEAEh, 0AFAFAFAFh, 0B0B0B0B0h
  137.     dd 0B1B1B1B1h, 0B2B2B2B2h, 0B3B3B3B3h, 0B4B4B4B4h
  138.     dd 0B5B5B5B5h, 0B6B6B6B6h, 0B7B7B7B7h, 0B8B8B8B8h
  139.     dd 0B9B9B9B9h, 0BABABABAh, 0BBBBBBBBh, 0BCBCBCBCh
  140.     dd 0BDBDBDBDh, 0BEBEBEBEh, 0BFBFBFBFh, 0C0C0C0C0h
  141.     dd 0C1C1C1C1h, 0C2C2C2C2h, 0C3C3C3C3h, 0C4C4C4C4h
  142.     dd 0C5C5C5C5h, 0C6C6C6C6h, 0C7C7C7C7h, 0C8C8C8C8h
  143.     dd 0C9C9C9C9h, 0CACACACAh, 0CBCBCBCBh, 0CCCCCCCCh
  144.     dd 0CDCDCDCDh, 0CECECECEh, 0CFCFCFCFh, 0D0D0D0D0h
  145.     dd 0D1D1D1D1h, 0D2D2D2D2h, 0D3D3D3D3h, 0D4D4D4D4h
  146.     dd 0D5D5D5D5h, 0D6D6D6D6h, 0D7D7D7D7h, 0D8D8D8D8h
  147.     dd 0D9D9D9D9h, 0DADADADAh, 0DBDBDBDBh, 0DCDCDCDCh
  148.     dd 0DDDDDDDDh, 0DEDEDEDEh, 0DFDFDFDFh, 0E0E0E0E0h
  149.     dd 0E1E1E1E1h, 0E2E2E2E2h, 0E3E3E3E3h, 0E4E4E4E4h
  150.     dd 0E5E5E5E5h, 0E6E6E6E6h, 0E7E7E7E7h, 0E8E8E8E8h
  151.     dd 0E9E9E9E9h, 0EAEAEAEAh, 0EBEBEBEBh, 0ECECECECh
  152.     dd 0EDEDEDEDh, 0EEEEEEEEh, 0EFEFEFEFh, 0F0F0F0F0h
  153.     dd 0F1F1F1F1h, 0F2F2F2F2h, 0F3F3F3F3h, 0F4F4F4F4h
  154.     dd 0F5F5F5F5h, 0F6F6F6F6h, 0F7F7F7F7h, 0F8F8F8F8h
  155.     dd 0F9F9F9F9h, 0FAFAFAFAh, 0FBFBFBFBh, 0FCFCFCFCh
  156.         dd 0FDFDFDFDh, 0FEFEFEFEh, 0FFFFFFFFh
  157.  
  158.  
  159.  
  160.  
  161. ; Code starts here
  162.  
  163. ;----------------------------------------------
  164. ; void setMode13h(char *vPage)
  165. ;----------------------------------------------
  166. ;
  167. ; Sets the video mode to 320x200x256 (REAL hard), and sets up page flipping,
  168. ; if you want to use it.  Sometimes (e.g. texture mappint) it's faster to
  169. ; write to the VGA one pixel at a time than it is to flip pages...don't ask
  170. ; me why.
  171. ;
  172. ; vPage = pointer to a buffer YOU have already allocated, better make it
  173. ; 64000 bytes (320x200) ... or MORE if you are in a generous mood.  I do this
  174. ; so you can access the virtual page from higher level code if you wish.
  175. ; The virtual page facilitates off screen drawing (should you set the active
  176. ; page to pVirtual (or 1)), which eliminates screen flicker and in most cases
  177. ; makes your animation appear to be smoother.  The virtual page tends to slow
  178. ; down gouraud shading and other drawing operations that write to the VGA
  179. ; one pixel at a time and do some calculating in between pixels.
  180.  
  181. sm13Stack struc
  182.                  dd  ?,? ; ebp, edi
  183.                  dd  ?   ; caller
  184.            vPage dd  ?   ; pointer to virtual page
  185. sm13Stack ends
  186.  
  187.         public setMode13h
  188.  
  189. setMode13h proc
  190.  
  191.         push ebp
  192.         push edi
  193.         mov ebp, esp
  194.  
  195.         mov eax, 13h
  196.         int 10h
  197.  
  198.         mov eax, [ebp].vPage
  199.         mov virtPage, eax
  200.         mov eax, vidSeg
  201.         mov curPage, eax
  202.  
  203.         mov eax, 0
  204.         mov edi, virtPage
  205.         mov ecx, 16000
  206.         rep stosd
  207.  
  208.         mov edi, vidSeg
  209.         mov ecx, 16000
  210.         rep stosd
  211.  
  212.         pop edi
  213.         pop ebp
  214.  
  215.         ret 4
  216.  
  217. setMode13h endp
  218.  
  219. ;--------------------
  220. ; void textMode(void)
  221. ;--------------------
  222. ;
  223. ; gets you back to 80x25...
  224. ;
  225.  
  226.         public textMode
  227.  
  228. textMode proc
  229.  
  230.         mov eax, 3
  231.         int 10h
  232.  
  233.         ret
  234.  
  235. textMode endp
  236.  
  237. ;--------------------------------------
  238. ;void setActivePage(int page)
  239. ;--------------------------------------
  240. ;
  241. ; Sets the page to be used for drawing, either the phyisical page (const
  242. ; pPhysical) or virtual page (const pVirtual).  REMEMBER that if you draw
  243. ; to the virtual page, you need to display it (flipVPage()) before you can
  244. ; see it.  Calling flipVPage() will copy the contents of the virtual page
  245. ; to the screen, regardless of which page is active, and does NOTHING else.
  246. ;
  247.  
  248.  
  249. sapStack struc
  250.                 dd  ?,? ; room for registers
  251.                 dd  ?   ; caller
  252.         aPage    dd  ?   ; new active page
  253. sapStack ends
  254.  
  255.         public setActivePage
  256.  
  257. setActivePage proc
  258.  
  259.         push ebp
  260.         push edi
  261.  
  262.         mov ebp, esp
  263.  
  264.         mov eax, [ebp].aPage
  265.         cmp eax, 0
  266.         jne sapVPage
  267.  
  268.         mov eax, vidSeg
  269.         mov curPage, eax
  270.         jmp sapDone
  271.  
  272. sapVPage:
  273.  
  274.         mov eax, virtPage
  275.         mov curPage, eax
  276.  
  277. sapDone:
  278.  
  279.         pop edi
  280.         pop ebp
  281.  
  282.         ret 4
  283.  
  284. setActivePage endp
  285.  
  286.  
  287. ;---------------------
  288. ; void flipVPage(void)
  289. ;---------------------
  290. ;
  291. ; flips the virtual page to the screen, displays what you have been drawing
  292. ; off screen.
  293.  
  294.  
  295.         public flipVPage
  296.  
  297. flipVPage proc
  298.  
  299.         push edi
  300.         push esi
  301.  
  302.         call syncDisplay
  303.  
  304.         mov esi, virtPage
  305.         mov edi, vidSeg
  306.         mov ecx, 16000
  307.  
  308.         cld
  309.         rep movsd
  310.  
  311.         pop esi
  312.         pop edi
  313.  
  314.         ret
  315.  
  316. flipVPage endp
  317.  
  318.  
  319. ; hline procedure used in poly filling, if you want to slow things down by
  320. ; calling it.  The poly3 function makes use of an inline version of this
  321. ; procedure which eliminates the stack pushes and calls.
  322.  
  323.  
  324. hlStack struc
  325.                 dd  ?,?         ; room for regs
  326.                 dd  ?           ; caller
  327.         hlcolor db  ?,?,?,?     ; color
  328.         hly     dd  ?           ; y
  329.         hlx2    dd  ?           ; x2
  330.         hlx1    dd  ?           ; x1
  331. hlStack ends
  332.  
  333.         public hline
  334.  
  335. hline proc
  336.  
  337.         push ebp
  338.         push edi
  339.         mov ebp, esp
  340.  
  341.         mov eax, [ebp].hly
  342.         mov ebx, 320
  343.         mul ebx
  344.  
  345.         mov edi, curPage
  346.  
  347.         mov ecx, [ebp].hlx1
  348.         mov ebx, [ebp].hlx2
  349.  
  350.         cmp ebx, ecx
  351.         jg hlDraw
  352.         xchg ebx, ecx
  353.  
  354. hlDraw: add eax, ecx
  355.         add edi, eax
  356.  
  357.         sub ebx, ecx
  358.         mov ecx, ebx
  359.         and ebx, 3
  360.         shr ecx, 2
  361.  
  362.         mov ah, [ebp].hlcolor
  363.         mov al, ah
  364.         movzx edx, ax
  365.         shl eax, 16
  366.         or eax, edx
  367.  
  368.         cld
  369.         rep stosd
  370.         mov ecx, ebx
  371.         rep stosb
  372.  
  373.         pop edi
  374.         pop ebp
  375.  
  376.         ret 16
  377.  
  378. hline endp
  379.  
  380. ;----------------------------------------
  381. ; void setPixel(int x, int y, int color)
  382. ;----------------------------------------
  383. ;
  384. ; Sets the pixel at (x, y) to color (color).  Does bounds checking to avoid
  385. ; the dreaded GP FAULT!
  386. ;
  387.  
  388.  
  389. spStack struc
  390.                   dd  ?,?         ; ebp, edi
  391.                   dd  ?           ; caller
  392.         setpColor dd  ?           ; color of pixel
  393.         setpY     dd  ?           ; Y value
  394.         setpX     dd  ?           ; X value
  395. spStack ends
  396.  
  397.         public setPixel
  398.  
  399. setPixel proc
  400.  
  401.         push ebp
  402.         push edi
  403.         mov ebp, esp
  404.  
  405.         mov eax, [ebp].setpY
  406.         mov ecx, [ebp].setpX
  407.  
  408.         cmp eax, 0
  409.         jl setPixDone
  410.         cmp eax, 199
  411.         jg setPixDone
  412.         cmp ecx, 0
  413.         jl setPixDone
  414.         cmp ecx, 319
  415.         jg setPixDone
  416.  
  417.         mov ebx, 320
  418.         mul ebx
  419.         add eax, ecx
  420.  
  421.         mov edi, eax
  422.         add edi, curPage
  423.  
  424.         mov eax, [ebp].setpColor
  425.         stosb
  426.  
  427. setPixDone:
  428.         pop edi
  429.         pop ebp
  430.  
  431.         ret 12
  432.  
  433. setPixel endp
  434.  
  435. ;-----------------------
  436. ; void syncDisplay(void)
  437. ;-----------------------
  438. ; waits for the current vertical retrace to end, then waits for the start
  439. ; of the next one.
  440. ;
  441.  
  442.         public syncDisplay
  443.  
  444. syncDisplay proc
  445.  
  446.         mov     dx, 03DAh
  447.  
  448. wait0:
  449.         in      al, dx
  450.         test    al, 08h
  451.         jnz     wait0
  452.  
  453. wait1:
  454.         in      al, dx
  455.         test    al, 08h
  456.         jz      wait1
  457.  
  458.         ret
  459.  
  460. syncDisplay endp
  461.  
  462.  
  463. ; a few basic mouse routines...I never implemented anything more in this 
  464. ; library.  Mice are easy, just refer to any interrupt listing for help.
  465.  
  466.         public initMouse
  467.  
  468. initMouse proc
  469.  
  470.         mov ax, 0
  471.         int 33h
  472.  
  473.         ret
  474.  
  475. initMouse endp
  476.  
  477.         public showMouse
  478.  
  479. showMouse proc
  480.  
  481.         mov ax, 1
  482.         int 33h
  483.  
  484.         ret
  485.  
  486. showMouse endp
  487.  
  488.         public hideMouse
  489.  
  490. hideMouse proc
  491.  
  492.         mov ax, 2
  493.         int 33h
  494.  
  495.         ret
  496.  
  497. hideMouse endp
  498.  
  499.  
  500. ;----------------------------------------------------------------------------
  501. ; void poly3(int x1, int y1, int x2, int y2, int x3, int y3, int c);
  502. ;----------------------------------------------------------------------------
  503. ;
  504. ; Draws a clipped triangular polygon bounded by (x1,y1) (x2,y2) (x3,y3) 
  505. ; in color c.  This routine does NOT do shading!
  506. ;
  507.  
  508.  
  509. p3Stack struc
  510.                 dd  ?,?,?       ; room for regs
  511.                 dd  ?           ; caller
  512.         p3color db  ?,?,?,?     ; color to fill
  513.         p3y3    dd  ?           ; y3
  514.         p3x3    dd  ?           ; x3
  515.         p3y2    dd  ?           ; y2
  516.         p3x2    dd  ?           ; x2
  517.         p3y1    dd  ?           ; y1
  518.         p3x1    dd  ?           ; x1
  519.  
  520. p3Stack ends
  521.  
  522.         public poly3
  523.  
  524. poly3 proc
  525.  
  526.         push ebp
  527.         push edi
  528.         push esi
  529.  
  530.         mov ebp, esp
  531.  
  532.         mov eax, [ebp].p3y1
  533.         mov ebx, [ebp].p3y2
  534.         mov ecx, [ebp].p3y3
  535.  
  536.         ; sort the points based on y values
  537.  
  538. yComp1: cmp eax, ebx
  539.         jg y2top
  540.  
  541.         mov yTop, eax
  542.         mov edx, [ebp].p3x1
  543.         mov xTop, edx
  544.  
  545.         mov yBot, ebx
  546.         mov edx, [ebp].p3x2
  547.         mov xBot, edx
  548.  
  549.         jmp yComp2
  550.  
  551. y2top:  mov yTop, ebx
  552.         mov edx, [ebp].p3x2
  553.         mov xTop, edx
  554.  
  555.         mov yBot, eax
  556.         mov edx, [ebp].p3x1
  557.         mov xBot, edx
  558.  
  559. yComp2: cmp ecx, yTop
  560.         jg yTopOK
  561.  
  562.         mov yTop, ecx
  563.         mov edx, [ebp].p3x3
  564.         mov xTop, edx
  565.  
  566.         cmp eax, ebx
  567.         jg y2mid
  568.  
  569.         mov yMid, eax
  570.         mov edx, [ebp].p3x1
  571.         mov xMid, edx
  572.  
  573.         mov yBot, ebx
  574.         mov edx, [ebp].p3x2
  575.         mov xBot, edx
  576.  
  577.         jmp yCompDone
  578.  
  579. y2mid:  mov yMid, ebx
  580.         mov edx, [ebp].p3x2
  581.         mov xMid, edx
  582.  
  583.         mov yBot, eax
  584.         mov edx, [ebp].p3x1
  585.         mov xBot, edx
  586.  
  587.         jmp yCompDone
  588.  
  589. yTopOK: cmp ecx, yBot
  590.         jg ybBad
  591.  
  592.         mov yMid, ecx
  593.         mov edx, [ebp].p3x3
  594.         mov xMid, edx
  595.  
  596.         jmp yCompDone
  597.  
  598. ybBad:  mov eax, yBot
  599.         mov ebx, xBot
  600.  
  601.         mov yMid, eax
  602.         mov xMid, ebx
  603.  
  604.         mov yBot, ecx
  605.         mov edx, [ebp].p3x3
  606.         mov xBot, edx
  607.  
  608. yCompDone:
  609.  
  610.         mov eax, yTop
  611.         mov ebx, yBot
  612.         cmp eax, 199
  613.         jg fillDone
  614.         cmp ebx, 0
  615.         jl fillDone
  616.  
  617.         ; now calculate the x values at each scanline for the longest side.
  618.  
  619.         mov eax, xBot
  620.         mov ebx, xTop
  621.         sub eax, ebx
  622.         shl eax, 16
  623.  
  624.         mov ecx, yBot
  625.         mov edx, yTop
  626.         sub ecx, edx
  627.  
  628.         jecxz edge1Horz         ; skip the div if denominator = 0
  629.         cmp eax, 0
  630.         jge edge1Pos
  631.  
  632.         neg eax
  633.         xor edx, edx
  634.         div ecx
  635.         neg eax
  636.  
  637.         jmp edge1Continue
  638.  
  639. edge1Horz:
  640.         ;xor eax, eax
  641.         ;xor edx, edx
  642.         ;jmp edge1Continue
  643.  
  644.         jmp edge2Start
  645.  
  646. edge1Pos:
  647.         xor edx, edx
  648.         div ecx
  649.  
  650. edge1Continue:
  651.         mov ecx, yBot
  652.         mov ebx, yTop
  653.         sub ecx, ebx
  654.  
  655.         shl ebx, 2
  656.         lea edi, lEdge
  657.         add edi, ebx
  658.  
  659.         xor ebx, ebx
  660.         mov edx, xTop
  661.         mov esi, yTop
  662.  
  663.         align 4
  664.  
  665. edge1Loop:
  666.  
  667.         cmp esi, 0
  668.         jl skipThisLine1
  669.         cmp esi, 199
  670.         jg edge2Start
  671.  
  672.         ror ebx, 16
  673.         add dx, bx
  674.         movsx edx, dx
  675.         rol ebx, 16
  676.         movzx ebx, bx
  677.         mov [edi], edx
  678.  
  679. skipThisLine1:
  680.         add ebx, eax
  681.         add edi, 4
  682.         inc esi
  683.         dec ecx
  684.         jns edge1Loop
  685.  
  686.         ; calculate x values for next side
  687.  
  688. edge2Start:
  689.         mov eax, xBot
  690.         mov ebx, xMid
  691.         sub eax, ebx
  692.         shl eax, 16
  693.  
  694.         mov ecx, yBot
  695.         mov edx, yMid
  696.         sub ecx, edx
  697.  
  698.         jecxz edge2Horz
  699.         cmp eax, 0
  700.         jge edge2Pos
  701.  
  702.         neg eax
  703.         xor edx, edx
  704.         div ecx
  705.         neg eax
  706.         jmp edge2Continue
  707.  
  708. edge2Horz:
  709.         ;xor eax, eax
  710.         ;xor edx, edx
  711.         ;jmp edge2Continue
  712.         jmp edge3Start
  713.  
  714. edge2Pos:
  715.         xor edx, edx
  716.         div ecx
  717.  
  718. edge2Continue:
  719.         mov ecx, yBot
  720.         mov ebx, yMid
  721.         sub ecx, ebx
  722.  
  723.         shl ebx, 2
  724.         lea edi, rEdge
  725.         add edi, ebx
  726.  
  727.         xor ebx, ebx
  728.         mov edx, xMid
  729.         mov esi, yMid
  730.  
  731.         align 4
  732.  
  733. edge2Loop:
  734.  
  735.         cmp esi, 0
  736.         jl skipThisLine2
  737.         cmp esi, 199
  738.         jg edge3Start
  739.  
  740.         ror ebx, 16
  741.         add dx, bx
  742.         movsx edx, dx
  743.         rol ebx, 16
  744.         movzx ebx, bx
  745.         mov [edi], edx
  746.  
  747. skipThisLine2:
  748.         add ebx, eax
  749.         add edi, 4
  750.         inc esi
  751.         dec ecx
  752.         jns edge2Loop
  753.  
  754.         ; calculate x values for last side
  755.  
  756. edge3Start:
  757.         mov eax, xMid
  758.         mov ebx, xTop
  759.         sub eax, ebx
  760.         shl eax, 16
  761.  
  762.         mov ecx, yMid
  763.         mov edx, yTop
  764.         sub ecx, edx
  765.  
  766.         jecxz edge3Horz
  767.         cmp eax, 0
  768.         jge edge3Pos
  769.  
  770.         neg eax
  771.         xor edx, edx
  772.         div ecx
  773.         neg eax
  774.  
  775.         jmp edge3Continue
  776.  
  777. edge3Horz:
  778.         ;xor eax, eax            ; zero ratio
  779.         ;xor edx, edx
  780.         ;jmp edge3Continue
  781.         jmp fillStart
  782.  
  783. edge3Pos:
  784.         xor edx, edx
  785.         div ecx
  786.  
  787. edge3Continue:
  788.         mov ecx, yMid
  789.         mov ebx, yTop
  790.         sub ecx, ebx
  791.  
  792.         shl ebx, 2
  793.         lea edi, rEdge
  794.         add edi, ebx
  795.  
  796.         xor ebx, ebx
  797.         mov edx, xTop
  798.         mov esi, yTop
  799.  
  800.         align 4
  801.  
  802. edge3Loop:
  803.  
  804.         cmp esi, 0
  805.         jl skipThisLine3
  806.         cmp esi, 199
  807.         jg fillStart
  808.  
  809.         ror ebx, 16
  810.         add dx, bx
  811.         movsx edx, dx
  812.         rol ebx, 16
  813.         movzx ebx, bx
  814.         mov [edi], edx
  815.  
  816. skipThisLine3:
  817.         add ebx, eax
  818.         add edi, 4
  819.         inc esi
  820.         dec ecx
  821.         jns edge3Loop
  822.  
  823.         ; time to fill...
  824.  
  825. fillStart:
  826.  
  827.         mov eax, yTop
  828.         mov ebx, yBot
  829.  
  830.         cmp eax, 0
  831.         jge checkBot
  832.         xor eax, eax
  833.         mov yTop, eax
  834.  
  835. checkBot:
  836.         cmp ebx, 199
  837.         jle fillNOW
  838.         mov ebx, 199
  839.         mov yBot, ebx
  840.  
  841. fillNOW:
  842.         lea esi, lEdge
  843.         lea edi, rEdge
  844.  
  845.         mov dl, [ebp].p3color
  846.         mov dh, dl
  847.         movzx edx, dx
  848.         mov eax, edx
  849.         shl eax, 16
  850.         or edx, eax
  851.         mov rhlColor, edx
  852.  
  853.         mov ecx, yTop
  854.         mov ebx, yBot
  855.         shl ecx, 2
  856.         add esi, ecx
  857.         add edi, ecx
  858.         shr ecx, 2
  859.  
  860.         align 4
  861.  
  862. fillME: push ecx
  863.  
  864.         ; another way to draw the hline, with register calls rather than
  865.         ; stack pushes to improve speed
  866.         ;
  867.         ; ON ENTRY
  868.         ; [esi] = x1
  869.         ; [edi] = x2
  870.         ; ecx = y
  871.         ; rhlColor = color to fill line with as a dword, that is, to draw
  872.         ;            a line of color 1, rhlColor would be 01010101
  873.  
  874.         ;public regHline
  875.  
  876.         mov eax, 320
  877.         xor edx, edx
  878.         mul ecx
  879.  
  880.         mov ecx, [esi]
  881.         mov ebx, [edi]
  882.  
  883.         cmp ebx, ecx
  884.         jg rhlDraw
  885.         xchg ebx, ecx
  886.  
  887. rhlDraw:
  888.  
  889.         cmp ecx, 319
  890.         jg nextLine
  891.  
  892.         cmp ebx, 0
  893.         jl nextLine
  894.  
  895. checkX2:
  896.         cmp ebx, 319
  897.         jle checkX1
  898.         mov ebx, 319
  899.  
  900. checkX1:
  901.         cmp ecx, 0
  902.         jge x1OKToo
  903.         xor ecx, ecx
  904.  
  905. x1OKToo:
  906.         push edi
  907.         add eax, ecx
  908.         mov edi, curPage
  909.         add edi, eax
  910.  
  911.         sub ebx, ecx
  912.         mov ecx, ebx
  913.         and ebx, 3
  914.         shr ecx, 2
  915.  
  916.         mov eax, rhlColor
  917.  
  918.         cld
  919.         rep stosd
  920.         mov ecx, ebx
  921.         rep stosb
  922.  
  923.         pop edi
  924.  
  925.         ; end of the rhline proc (used to be a proc anyway...)
  926.  
  927. nextLine:
  928.         pop ecx
  929.  
  930.         add esi, 4
  931.         add edi, 4
  932.         inc ecx
  933.         cmp ecx, yBot
  934.         jg fillDone
  935.         jmp fillME
  936.  
  937. fillDone:
  938.  
  939.         pop esi
  940.         pop edi
  941.         pop ebp
  942.  
  943.         ret 28
  944.  
  945. poly3 endp
  946.  
  947. ;----------------------------
  948. ; void clearScreen(int color)
  949. ;----------------------------
  950. ;
  951. ; fills the screen with color (color).  This is perhaps the most difficult 
  952. ; thing I've ever written...heheh
  953. ;
  954.  
  955. csStack struc
  956.  
  957.                 dd  ?,?         ; ebp, edi
  958.                 dd  ?           ; caller
  959.         csColor db  ?,?,?,?     ; color
  960.  
  961. csStack ends
  962.  
  963.         public clearScreen
  964.  
  965. clearScreen proc
  966.  
  967.         push ebp
  968.         push edi
  969.  
  970.         mov ebp, esp
  971.  
  972.         mov edi, curPage
  973.         mov ecx, 16000
  974.         mov al, [ebp].csColor
  975.         mov ah, al
  976.         movzx edx, ax
  977.         shl eax, 16
  978.         or eax, edx
  979.  
  980.         rep stosd
  981.  
  982.         pop edi
  983.         pop ebp
  984.  
  985.         ret 4
  986.  
  987. clearScreen endp
  988.  
  989.  
  990. ; Palette routines courtesy of Matt Pritchard (MODEX).  Something went wrong
  991. ; with the load_dac_registers routine in the conversion to 32 bit and pmode,
  992. ; and I haven't found the time to correct it yet...what a lazy bum I am!
  993. ; I've been using repeated calls to the set_dac_register routine instead...
  994.  
  995. ;=================================================
  996. ;SET_DAC_REGISTER (Register%, Red%, Green%, Blue%)
  997. ;=================================================
  998. ;
  999. ; Sets a single (RGB) Vga Palette Register
  1000. ;
  1001. ; ENTRY: Register = The DAC # to modify (0-255)
  1002. ;        Red      = The new Red Intensity (0-63)
  1003. ;        Green    = The new Green Intensity (0-63)
  1004. ;        Blue     = The new Blue Intensity (0-63)
  1005. ;
  1006. ; EXIT:  No meaningful values returned
  1007. ;
  1008.  
  1009. SDR_STACK   STRUC
  1010.                     DD  ?   ; eBP
  1011.                     DD  ?   ; Caller
  1012.     SDR_Blue        DB  ?,?,?,? ; Blue Data Value
  1013.     SDR_Green       DB  ?,?,?,? ; Green Data Value
  1014.     SDR_Red         DB  ?,?,?,? ; Red Data Value
  1015.     SDR_Register    DB  ?,?,?,? ; Palette Register #
  1016. SDR_STACK   ENDS
  1017.  
  1018.     PUBLIC  SET_DAC_REGISTER
  1019.  
  1020. SET_DAC_REGISTER    PROC
  1021.  
  1022.     PUSH    eBP                  ; Save BP
  1023.     MOV     eBP, eSP              ; Set up Stack Frame
  1024.  
  1025.     ; Select which DAC Register to modify
  1026.  
  1027.     mov     dx, 03C8h
  1028.     mov     al, [eBP].SDR_Register
  1029.     out     dx, al
  1030.  
  1031.     MOV     DX, 03C9h           ; Dac Data Register
  1032.     mov     al, [eBP].SDR_Red    ; Set Red Intensity
  1033.     out     dx, al
  1034.     mov     al, [eBP].SDR_Green  ; Set Green Intensity
  1035.     out     dx, al
  1036.     mov     al, [eBP].SDR_Blue   ; Set Blue Intensity
  1037.     out     dx, al
  1038.  
  1039.     POP     eBP                  ; Restore Registers
  1040.     RET     16                  ; Exit & Clean Up Stack
  1041.  
  1042. SET_DAC_REGISTER    ENDP
  1043.  
  1044.  
  1045. ;===========================================================
  1046. ;LOAD_DAC_REGISTERS (SEG PalData, StartReg%, EndReg%, Sync%)
  1047. ;===========================================================
  1048. ;
  1049. ; Sets a Block of Vga Palette Registers
  1050. ;
  1051. ; ENTRY: PalData  = Far Pointer to Block of palette data
  1052. ;        StartReg = First Register # in range to set (0-255)
  1053. ;        EndReg   = Last Register # in Range to set (0-255)
  1054. ;        Sync     = Wait for Vertical Retrace Flag (Boolean)
  1055. ;
  1056. ; EXIT:  No meaningful values returned
  1057. ;
  1058. ; NOTES: PalData is a linear array of 3 byte Palette values
  1059. ;        in the order: Red  (0-63), Green (0-63), Blue (0-63)
  1060. ;
  1061.  
  1062. LDR_STACK   STRUC
  1063.                     DD  ?,?     ; EBP, ESI
  1064.                     DD  ?       ; Caller
  1065.     LDR_Sync        DW  ?,?     ; Vertical Sync Flag
  1066.     LDR_EndReg      DB  ?,?,?,? ; Last Register #
  1067.     LDR_StartReg    DB  ?,?,?,? ; First Register #
  1068.     LDR_PalData     DD  ?       ; Far Ptr to Palette Data
  1069. LDR_STACK   ENDS
  1070.  
  1071.     PUBLIC  LOAD_DAC_REGISTERS
  1072.  
  1073. LOAD_DAC_REGISTERS  PROC
  1074.  
  1075.     PUSH    ebp
  1076.     push    esi                  ; Save Registers
  1077.     mov     ebp, esp              ; Set up Stack Frame
  1078.  
  1079.     mov     AX, [BP].LDR_Sync   ; Get Vertical Sync Flag
  1080.     or      AX, AX              ; is Sync Flag = 0?
  1081.     jz      @LDR_Load           ; if so, skip call
  1082.  
  1083.     call    syncDisplay         ; wait for vsync
  1084.  
  1085.     ; Determine register #'s, size to copy, etc
  1086.  
  1087. @LDR_Load:
  1088.  
  1089.     mov     esi, [BP].LDR_PalData    ; DS:SI -> Palette Data
  1090.     mov     DX, 03C8h      ; DAC register # selector
  1091.  
  1092.     xor     AX, ax
  1093.     xor     BX, bx                  ; Clear for byte loads
  1094.     mov     AL, [BP].LDR_StartReg   ; Get Start Register
  1095.     mov     BL, [BP].LDR_EndReg     ; Get End Register
  1096.  
  1097.     sub     BX, AX              ; BX = # of DAC registers -1
  1098.     inc     BX                  ; BX = # of DAC registers
  1099.     mov     CX, BX              ; CX = # of DAC registers
  1100.     add     CX, BX              ; CX =  "   " * 2
  1101.     add     CX, BX              ; CX =  "   " * 3
  1102.     cld                         ; Block OUTs forward
  1103.     out     DX, AL              ; set up correct register #
  1104.  
  1105.     ; Load a block of DAC Registers
  1106.  
  1107.     mov     DX, 03C9h    ; Dac Data Register
  1108.  
  1109.     rep     outsb               ; block set DAC registers
  1110.  
  1111.     POP     esi
  1112.     pop     ebp                  ; Restore Registers
  1113.  
  1114.     ret     20                  ; Exit & Clean Up Stack
  1115.  
  1116. LOAD_DAC_REGISTERS  ENDP
  1117.  
  1118. ;----------------------------------------------------
  1119. ; void ghline(int x1, int c1, int x2, int c2, int y);
  1120. ;----------------------------------------------------
  1121. ;
  1122. ; draws a horizontal line from (x1, y) to (x2, y) and interpolates colors
  1123. ; (byte granularity) from c1 to c2 in the process.  This is used to fill
  1124. ; polygons in the gpoly3 routine.  I really should make this an inline
  1125. ; procedure like I did with hline, but the call is so much more complex...
  1126. ; I figured it would take just about as long either way.  Clipping too...
  1127. ;
  1128.  
  1129.  
  1130. ghlStack struc
  1131.  
  1132.                 dd ?,?,?        ; ebp esi edi
  1133.                 dd ?            ; caller
  1134.         ghly    dd ?            ; y
  1135.         ghlc2   dd ?            ; c2
  1136.         ghlx2   dd ?            ; x2
  1137.         ghlc1   dd ?            ; c1
  1138.         ghlx1   dd ?            ; x1
  1139.  
  1140. ghlStack ends
  1141.  
  1142.         public gHline
  1143.  
  1144. gHline proc     ; gouraud hline routine
  1145.  
  1146.         push ebp
  1147.         push esi
  1148.         push edi
  1149.         mov ebp, esp
  1150.  
  1151.         mov eax, [ebp].ghly
  1152.         mov ebx, 320
  1153.         mul ebx
  1154.  
  1155.         mov edi, curPage
  1156.  
  1157.         mov ecx, [ebp].ghlx1
  1158.         mov ebx, [ebp].ghlx2
  1159.         mov esi, [ebp].ghlc1
  1160.         mov edx, [ebp].ghlc2
  1161.  
  1162.         cmp ebx, ecx
  1163.         jg ghlDraw
  1164.         xchg ebx, ecx
  1165.         xchg esi, edx
  1166.  
  1167. ghlDraw:
  1168.         mov [ebp].ghlc2, edx
  1169.  
  1170.         cmp ecx, 0
  1171.         jge ghlx1ok
  1172.         mov ecx, 0
  1173.  
  1174. ghlx1ok:
  1175.         cmp ecx, 320
  1176.         jge ghldone
  1177.  
  1178.         cmp ebx, 319
  1179.         jl ghlx2ok
  1180.         mov ebx, 319
  1181.  
  1182. ghlx2ok:
  1183.         cmp ebx, 0
  1184.         jl ghldone
  1185.  
  1186.  
  1187.         add eax, ecx
  1188.         add edi, eax
  1189.  
  1190.         sub ebx, ecx
  1191.         mov ecx, ebx
  1192.  
  1193.         jecxz ghlIHATESHORTJUMPS
  1194.  
  1195. ;        and ebx, 3
  1196. ;        shr ecx, 2
  1197.  
  1198.  
  1199.  
  1200.  
  1201.         mov eax, edx
  1202.         sub eax, esi
  1203.         shl eax, 8             ; dc *= 256 
  1204.         xor edx, edx
  1205.  
  1206.         cmp eax, 0
  1207.         jl ghlNeg
  1208.         div ebx                 ; get dcdx
  1209.         jmp ghlGoOn
  1210.  
  1211. ghlIHATESHORTJUMPS:
  1212.         jmp ghlDone
  1213.  
  1214. ghlNeg:
  1215.         neg eax
  1216.         div ebx
  1217.         neg eax
  1218.  
  1219. ghlGoOn:
  1220.         mov edx, eax            ; edx = dcdx * 256
  1221.         mov ebx, esi            ; eax = c1
  1222.         shl ebx, 8              ; ebx *= 256
  1223.  
  1224.         ;mov esi, ecx
  1225.         ;and esi, 7
  1226.         ;shr ecx, 3
  1227.  
  1228.         cld
  1229.         align 4
  1230.  
  1231. ghlLoop:
  1232.         jcxz ghlMod
  1233.  
  1234.         mov [edi], bh
  1235.         inc edi
  1236.         add ebx, edx
  1237.  
  1238.         dec ecx
  1239.         jmp ghlLoop
  1240.  
  1241. ghlMod:
  1242.         ;mov ecx, esi
  1243.         ;rep stosb
  1244.  
  1245. ghlDone:
  1246.         pop edi
  1247.         pop esi
  1248.         pop ebp
  1249.  
  1250.         ret 20
  1251.  
  1252.  
  1253. gHline endp
  1254.  
  1255.  
  1256. ;----------------------------------------------------------------------------
  1257. ; void gpoly3(int x1, int y1, int c1, int x2, int y2, int c2, int x3, int y3,
  1258. ;               int c3);
  1259. ;----------------------------------------------------------------------------
  1260. ;
  1261. ; Draws a fully clipped gouraud shaded polygon at the given coordinates and 
  1262. ; colors.  If you don't understand the concept behind gouraud shading, this 
  1263. ; is not the place to learn.  Send email.
  1264. ;
  1265.  
  1266.  
  1267. gp3Stack struc
  1268.                 dd  ?,?,?       ; room for regs
  1269.                 dd  ?           ; caller
  1270.         gp3c3   dd  ?           ; c3
  1271.         gp3y3   dd  ?           ; y3
  1272.         gp3x3   dd  ?           ; x3
  1273.         gp3c2   dd  ?           ; c2
  1274.         gp3y2   dd  ?           ; y2
  1275.         gp3x2   dd  ?           ; x2
  1276.         gp3c1   dd  ?           ; c1
  1277.         gp3y1   dd  ?           ; y1
  1278.         gp3x1   dd  ?           ; x1
  1279.  
  1280. gp3Stack ends
  1281.  
  1282.         public gpoly3
  1283.  
  1284. gpoly3 proc
  1285.  
  1286.         push ebp
  1287.         push edi
  1288.         push esi
  1289.  
  1290.         mov ebp, esp
  1291.  
  1292.         mov eax, [ebp].gp3y1
  1293.         mov ebx, [ebp].gp3y2
  1294.         mov ecx, [ebp].gp3y3
  1295.  
  1296.         ; sort the points based on y values
  1297.  
  1298. gyComp1:
  1299.         cmp eax, ebx
  1300.         jg gy2top
  1301.  
  1302.         mov yTop, eax
  1303.         mov edx, [ebp].gp3x1
  1304.         mov xTop, edx
  1305.         mov edx, [ebp].gp3c1
  1306.         mov cTop, edx
  1307.  
  1308.         mov yBot, ebx
  1309.         mov edx, [ebp].gp3x2
  1310.         mov xBot, edx
  1311.         mov edx, [ebp].gp3c2
  1312.         mov cBot, edx
  1313.  
  1314.         jmp gyComp2
  1315.  
  1316. gy2top: mov yTop, ebx
  1317.         mov edx, [ebp].gp3x2
  1318.         mov xTop, edx
  1319.         mov edx, [ebp].gp3c2
  1320.         mov cTop, edx
  1321.  
  1322.         mov yBot, eax
  1323.         mov edx, [ebp].gp3x1
  1324.         mov xBot, edx
  1325.         mov edx, [ebp].gp3c1
  1326.         mov cBot, edx
  1327.  
  1328. gyComp2:
  1329.         cmp ecx, yTop
  1330.         jg gyTopOK
  1331.  
  1332.         mov yTop, ecx
  1333.         mov edx, [ebp].gp3x3
  1334.         mov xTop, edx
  1335.         mov edx, [ebp].gp3c3
  1336.         mov cTop, edx
  1337.  
  1338.         cmp eax, ebx
  1339.         jg gy2mid
  1340.  
  1341.         mov yMid, eax
  1342.         mov edx, [ebp].gp3x1
  1343.         mov xMid, edx
  1344.         mov edx, [ebp].gp3c1
  1345.         mov cMid, edx
  1346.  
  1347.         mov yBot, ebx
  1348.         mov edx, [ebp].gp3x2
  1349.         mov xBot, edx
  1350.         mov edx, [ebp].gp3c2
  1351.         mov cBot, edx
  1352.  
  1353.  
  1354.         jmp gyCompDone
  1355.  
  1356. gy2mid: mov yMid, ebx
  1357.         mov edx, [ebp].gp3x2
  1358.         mov xMid, edx
  1359.         mov edx, [ebp].gp3c2
  1360.         mov cMid, edx
  1361.  
  1362.         mov yBot, eax
  1363.         mov edx, [ebp].gp3x1
  1364.         mov xBot, edx
  1365.         mov edx, [ebp].gp3c1
  1366.         mov cBot, edx
  1367.  
  1368.         jmp gyCompDone
  1369.  
  1370. gyTopOK:
  1371.         cmp ecx, yBot
  1372.         jg gybBad
  1373.  
  1374.         mov yMid, ecx
  1375.         mov edx, [ebp].gp3x3
  1376.         mov xMid, edx
  1377.         mov edx, [ebp].gp3c3
  1378.         mov cMid, edx
  1379.  
  1380.         jmp gyCompDone
  1381.  
  1382. gybBad: mov eax, yBot
  1383.         mov ebx, xBot
  1384.         mov edx, cBot
  1385.  
  1386.         mov yMid, eax
  1387.         mov xMid, ebx
  1388.         mov cMid, edx
  1389.  
  1390.         mov yBot, ecx
  1391.         mov edx, [ebp].gp3x3
  1392.         mov xBot, edx
  1393.         mov edx, [ebp].gp3c3
  1394.         mov cBot, edx
  1395.  
  1396.  
  1397. gyCompDone:
  1398.  
  1399.         mov eax, yTop
  1400.         mov ebx, yBot
  1401.         cmp eax, 199
  1402.         jg gfillDone
  1403.         cmp ebx, 0
  1404.         jl gfillDone
  1405.  
  1406.         ; now calculate the x values at each scanline for the longest side.
  1407.  
  1408.         mov eax, xBot
  1409.         mov ebx, xTop
  1410.         sub eax, ebx
  1411.         shl eax, 16
  1412.  
  1413.         mov ecx, yBot
  1414.         mov edx, yTop
  1415.         sub ecx, edx
  1416.  
  1417.         jecxz gedge1Horz         ; skip the div if denominator = 0
  1418.         cmp eax, 0
  1419.         jge gedge1Pos
  1420.  
  1421.         neg eax
  1422.         xor edx, edx
  1423.         div ecx
  1424.         neg eax
  1425.  
  1426.         jmp gedge1Continue
  1427.  
  1428. gedge1Horz:
  1429.         ;xor eax, eax
  1430.         ;xor edx, edx
  1431.         ;jmp gedge1Continue
  1432.  
  1433.         jmp gedge2Start
  1434.  
  1435. gedge1Pos:
  1436.         xor edx, edx
  1437.         div ecx
  1438.  
  1439. gedge1Continue:
  1440.         mov ecx, yBot
  1441.         mov ebx, yTop
  1442.         sub ecx, ebx
  1443.  
  1444.         shl ebx, 2
  1445.         lea edi, lEdge
  1446.         add edi, ebx
  1447.  
  1448.         xor ebx, ebx
  1449.         mov edx, xTop
  1450.         mov esi, yTop
  1451.  
  1452.         align 4
  1453.  
  1454. gedge1Loop:
  1455.  
  1456.         cmp esi, 0
  1457.         jl gskipThisLine1
  1458.         cmp esi, 199
  1459.         jg gedge2Start
  1460.  
  1461.         ror ebx, 16
  1462.         add dx, bx
  1463.         movsx edx, dx
  1464.         rol ebx, 16
  1465.         movzx ebx, bx
  1466.         mov [edi], edx
  1467.  
  1468. gskipThisLine1:
  1469.         add ebx, eax
  1470.         add edi, 4
  1471.         inc esi
  1472.         dec ecx
  1473.         jns gedge1Loop
  1474.  
  1475.         ; calculate x values for next side
  1476.  
  1477. gedge2Start:
  1478.         mov eax, xBot
  1479.         mov ebx, xMid
  1480.         sub eax, ebx
  1481.         shl eax, 16
  1482.  
  1483.         mov ecx, yBot
  1484.         mov edx, yMid
  1485.         sub ecx, edx
  1486.  
  1487.         jecxz gedge2Horz
  1488.         cmp eax, 0
  1489.         jge gedge2Pos
  1490.  
  1491.         neg eax
  1492.         xor edx, edx
  1493.         div ecx
  1494.         neg eax
  1495.         jmp gedge2Continue
  1496.  
  1497. gedge2Horz:
  1498.         ;xor eax, eax
  1499.         ;xor edx, edx
  1500.         ;jmp gedge2Continue
  1501.         jmp gedge3Start
  1502.  
  1503. gedge2Pos:
  1504.         xor edx, edx
  1505.         div ecx
  1506.  
  1507. gedge2Continue:
  1508.         mov ecx, yBot
  1509.         mov ebx, yMid
  1510.         sub ecx, ebx
  1511.  
  1512.         shl ebx, 2
  1513.         lea edi, rEdge
  1514.         add edi, ebx
  1515.  
  1516.         xor ebx, ebx
  1517.         mov edx, xMid
  1518.         mov esi, yMid
  1519.  
  1520.         align 4
  1521.  
  1522. gedge2Loop:
  1523.  
  1524.         cmp esi, 0
  1525.         jl gskipThisLine2
  1526.         cmp esi, 199
  1527.         jg gedge3Start
  1528.  
  1529.         ror ebx, 16
  1530.         add dx, bx
  1531.         movsx edx, dx
  1532.         rol ebx, 16
  1533.         movzx ebx, bx
  1534.         mov [edi], edx
  1535.  
  1536. gskipThisLine2:
  1537.         add ebx, eax
  1538.         add edi, 4
  1539.         inc esi
  1540.         dec ecx
  1541.         jns gedge2Loop
  1542.  
  1543.         ; calculate x values for last side
  1544.  
  1545. gedge3Start:
  1546.         mov eax, xMid
  1547.         mov ebx, xTop
  1548.         sub eax, ebx
  1549.         shl eax, 16
  1550.  
  1551.         mov ecx, yMid
  1552.         mov edx, yTop
  1553.         sub ecx, edx
  1554.  
  1555.         jecxz gedge3Horz
  1556.         cmp eax, 0
  1557.         jge gedge3Pos
  1558.  
  1559.         neg eax
  1560.         xor edx, edx
  1561.         div ecx
  1562.         neg eax
  1563.  
  1564.         jmp gedge3Continue
  1565.  
  1566. gedge3Horz:
  1567.         ;xor eax, eax            ; zero ratio
  1568.         ;xor edx, edx
  1569.         ;jmp gedge3Continue
  1570.         jmp gcolorStartc
  1571.  
  1572. gedge3Pos:
  1573.         xor edx, edx
  1574.         div ecx
  1575.  
  1576. gedge3Continue:
  1577.         mov ecx, yMid
  1578.         mov ebx, yTop
  1579.         sub ecx, ebx
  1580.  
  1581.         shl ebx, 2
  1582.         lea edi, rEdge
  1583.         add edi, ebx
  1584.  
  1585.         xor ebx, ebx
  1586.         mov edx, xTop
  1587.         mov esi, yTop
  1588.  
  1589.         align 4
  1590.  
  1591. gedge3Loop:
  1592.  
  1593.         cmp esi, 0
  1594.         jl gskipThisLine3
  1595.         cmp esi, 199
  1596.         jg gcolorStartc
  1597.  
  1598.         ror ebx, 16
  1599.         add dx, bx
  1600.         movsx edx, dx
  1601.         rol ebx, 16
  1602.         movzx ebx, bx
  1603.         mov [edi], edx
  1604.  
  1605. gskipThisLine3:
  1606.         add ebx, eax
  1607.         add edi, 4
  1608.         inc esi
  1609.         dec ecx
  1610.         jns gedge3Loop
  1611.  
  1612. gcolorStartc:
  1613.  
  1614.         ; now calculate the color values at each scanline for the longest side.
  1615.  
  1616.         mov eax, cBot
  1617.         mov ebx, cTop
  1618.         sub eax, ebx
  1619.         shl eax, 16
  1620.  
  1621.         mov ecx, yBot
  1622.         mov edx, yTop
  1623.         sub ecx, edx
  1624.  
  1625.         jecxz gedge1Horzc         ; skip the div if denominator = 0
  1626.         cmp eax, 0
  1627.         jge gedge1Posc
  1628.  
  1629.         neg eax
  1630.         xor edx, edx
  1631.         div ecx
  1632.         neg eax
  1633.  
  1634.         jmp gedge1Continuec
  1635.  
  1636. gedge1Horzc:
  1637.         ;xor eax, eax
  1638.         ;xor edx, edx
  1639.         ;jmp gedge1Continuec
  1640.  
  1641.         jmp gedge2Startc
  1642.  
  1643. gedge1Posc:
  1644.         xor edx, edx
  1645.         div ecx
  1646.  
  1647. gedge1Continuec:
  1648.         mov ecx, yBot
  1649.         mov ebx, yTop
  1650.         sub ecx, ebx
  1651.  
  1652.         shl ebx, 2
  1653.         lea edi, lColor
  1654.         add edi, ebx
  1655.  
  1656.         xor ebx, ebx
  1657.         mov edx, cTop
  1658.         mov esi, yTop
  1659.  
  1660.         align 4
  1661.  
  1662. gedge1Loopc:
  1663.  
  1664.         cmp esi, 0
  1665.         jl gskipThisLine1c
  1666.         cmp esi, 199
  1667.         jg gedge2Startc
  1668.  
  1669.         ror ebx, 16
  1670.         add dx, bx
  1671.         movsx edx, dx
  1672.         rol ebx, 16
  1673.         movzx ebx, bx
  1674.         mov [edi], edx
  1675.  
  1676. gskipThisLine1c:
  1677.         add ebx, eax
  1678.         add edi, 4
  1679.         inc esi
  1680.         dec ecx
  1681.         jns gedge1Loopc
  1682.  
  1683.         ; calculate x values for next side
  1684.  
  1685. gedge2Startc:
  1686.         mov eax, cBot
  1687.         mov ebx, cMid
  1688.         sub eax, ebx
  1689.         shl eax, 16
  1690.  
  1691.         mov ecx, yBot
  1692.         mov edx, yMid
  1693.         sub ecx, edx
  1694.  
  1695.         jecxz gedge2Horzc
  1696.         cmp eax, 0
  1697.         jge gedge2Posc
  1698.  
  1699.         neg eax
  1700.         xor edx, edx
  1701.         div ecx
  1702.         neg eax
  1703.         jmp gedge2Continuec
  1704.  
  1705. gedge2Horzc:
  1706.         ;xor eax, eax
  1707.         ;xor edx, edx
  1708.         ;jmp gedge2Continuec
  1709.         jmp gedge3Startc
  1710.  
  1711. gedge2Posc:
  1712.         xor edx, edx
  1713.         div ecx
  1714.  
  1715. gedge2Continuec:
  1716.         mov ecx, yBot
  1717.         mov ebx, yMid
  1718.         sub ecx, ebx
  1719.  
  1720.         shl ebx, 2
  1721.         lea edi, rColor
  1722.         add edi, ebx
  1723.  
  1724.         xor ebx, ebx
  1725.         mov edx, cMid
  1726.         mov esi, yMid
  1727.  
  1728.         align 4
  1729.  
  1730. gedge2Loopc:
  1731.  
  1732.         cmp esi, 0
  1733.         jl gskipThisLine2c
  1734.         cmp esi, 199
  1735.         jg gedge3Startc
  1736.  
  1737.         ror ebx, 16
  1738.         add dx, bx
  1739.         movsx edx, dx
  1740.         rol ebx, 16
  1741.         movzx ebx, bx
  1742.         mov [edi], edx
  1743.  
  1744. gskipThisLine2c:
  1745.         add ebx, eax
  1746.         add edi, 4
  1747.         inc esi
  1748.         dec ecx
  1749.         jns gedge2Loopc
  1750.  
  1751.         ; calculate x values for last side
  1752.  
  1753. gedge3Startc:
  1754.         mov eax, cMid
  1755.         mov ebx, cTop
  1756.         sub eax, ebx
  1757.         shl eax, 16
  1758.  
  1759.         mov ecx, yMid
  1760.         mov edx, yTop
  1761.         sub ecx, edx
  1762.  
  1763.         jecxz gedge3Horzc
  1764.         cmp eax, 0
  1765.         jge gedge3Posc
  1766.  
  1767.         neg eax
  1768.         xor edx, edx
  1769.         div ecx
  1770.         neg eax
  1771.  
  1772.         jmp gedge3Continuec
  1773.  
  1774. gedge3Horzc:
  1775.         ;xor eax, eax            ; zero ratio
  1776.         ;xor edx, edx
  1777.         ;jmp gedge3Continuec
  1778.         jmp gfillStart
  1779.  
  1780. gedge3Posc:
  1781.         xor edx, edx
  1782.         div ecx
  1783.  
  1784. gedge3Continuec:
  1785.         mov ecx, yMid
  1786.         mov ebx, yTop
  1787.         sub ecx, ebx
  1788.  
  1789.         shl ebx, 2
  1790.         lea edi, rColor
  1791.         add edi, ebx
  1792.  
  1793.         xor ebx, ebx
  1794.         mov edx, cTop
  1795.         mov esi, yTop
  1796.  
  1797.         align 4
  1798.  
  1799. gedge3Loopc:
  1800.  
  1801.         cmp esi, 0
  1802.         jl gskipThisLine3c
  1803.         cmp esi, 199
  1804.         jg gfillStart
  1805.  
  1806.         ror ebx, 16
  1807.         add dx, bx
  1808.         movsx edx, dx
  1809.         rol ebx, 16
  1810.         movzx ebx, bx
  1811.         mov [edi], edx
  1812.  
  1813. gskipThisLine3c:
  1814.         add ebx, eax
  1815.         add edi, 4
  1816.         inc esi
  1817.         dec ecx
  1818.         jns gedge3Loopc
  1819.  
  1820.  
  1821.         ; time to fill...
  1822.  
  1823. gfillStart:
  1824.  
  1825.         mov eax, yTop
  1826.         mov ebx, yBot
  1827.  
  1828.         cmp eax, 0
  1829.         jge gcheckBot
  1830.         xor eax, eax
  1831.         mov yTop, eax
  1832.  
  1833. gcheckBot:
  1834.         cmp ebx, 199
  1835.         jle gfillNOW
  1836.         mov ebx, 199
  1837.         mov yBot, ebx
  1838.  
  1839. gfillNOW:
  1840.         lea esi, lEdge
  1841.         lea edi, rEdge
  1842.  
  1843.         lea eax, lColor
  1844.         lea edx, rColor
  1845.  
  1846.         mov ecx, yTop
  1847.         mov ebx, yBot
  1848.         shl ecx, 2
  1849.  
  1850.         add esi, ecx
  1851.         add edi, ecx
  1852.         add eax, ecx
  1853.         add edx, ecx
  1854.  
  1855.         shr ecx, 2
  1856.  
  1857.         align 4
  1858.  
  1859. gfillME: push ecx
  1860.  
  1861.  
  1862. grhlDraw:
  1863.  
  1864.         cmp ecx, 319
  1865.         jg gnextLine
  1866.  
  1867.         cmp ebx, 0
  1868.         jl gnextLine
  1869.  
  1870. gcheckX2:
  1871.         cmp ebx, 319
  1872.         jle gcheckX1
  1873.         mov ebx, 319
  1874.  
  1875. gcheckX1:
  1876.         cmp ecx, 0
  1877.         jge gx1OKToo
  1878.         xor ecx, ecx
  1879.  
  1880. gx1OKToo:
  1881.         push esi
  1882.         push eax
  1883.         push edi
  1884.         push edx
  1885.  
  1886.         push [esi]
  1887.         push [eax]
  1888.         push [edi]
  1889.         push [edx]
  1890.         push ecx
  1891.  
  1892.         call gHline
  1893.  
  1894.         pop edx
  1895.         pop edi
  1896.         pop eax
  1897.         pop esi
  1898.  
  1899. gnextLine:
  1900.         pop ecx
  1901.  
  1902.         add esi, 4
  1903.         add edi, 4
  1904.         add eax, 4
  1905.         add edx, 4
  1906.         inc ecx
  1907.         cmp ecx, yBot
  1908.         jg gfillDone
  1909.         jmp gfillME
  1910.  
  1911. gfillDone:
  1912.  
  1913.         pop esi
  1914.         pop edi
  1915.         pop ebp
  1916.  
  1917.         ret 36
  1918.  
  1919. gpoly3 endp
  1920.  
  1921.  
  1922. ;--------------------------------------------------------------------
  1923. ; void tDrawBitmap(char *image, int x, int y, int width, int height);
  1924. ;--------------------------------------------------------------------
  1925. ;
  1926. ; draws a bitmapt to the screen, with color 0 transparent.  Full clipping
  1927. ; is done as an added bonus...
  1928. ;
  1929.  
  1930. tdbStack STRUC
  1931.  
  1932.                         dd  ?,?,?       ; ebp, esi, edi
  1933.                         dd  ?           ; caller
  1934.         tdbHeight       dd  ?
  1935.         tdbWidth        dd  ?
  1936.         tdbY            dd  ?
  1937.         tdbX            dd  ?
  1938.         tdbImage        dd  ?
  1939.  
  1940. tdbStack ENDS
  1941.  
  1942.         public tDrawBitmap
  1943.  
  1944. tDrawBitmap proc
  1945.  
  1946.         push edi
  1947.         push esi
  1948.         push ebp
  1949.  
  1950.         mov ebp, esp
  1951.  
  1952.         mov eax, 0
  1953.         mov sPos, eax
  1954.         mov xOffset, 0
  1955.         mov yOffset, 0
  1956.  
  1957.         mov esi, [ebp].tdbImage
  1958.         mov edi, curPage
  1959.         mov ecx, [ebp].tdbY
  1960.         mov eax, 320
  1961.         mul ecx
  1962.         mov edx, [ebp].tdbX
  1963.         add eax, edx
  1964.         mov dPos, eax
  1965.  
  1966.         mov ebx, [ebp].tdbWidth
  1967.         mov eax, [ebp].tdbHeight
  1968.         mov oWidth, ebx
  1969.         mov nWidth, ebx
  1970.         mov oHeight, eax
  1971.         mov nHeight, eax
  1972.  
  1973.         ; clipping action...
  1974.  
  1975.         cmp edx, 0
  1976.         jl tdbXNeg
  1977.  
  1978. tdbCheckY:
  1979.         cmp ecx, 0
  1980.         jl tdbYNeg
  1981.  
  1982.         jmp tdbContinue
  1983.  
  1984. tdbXNeg:
  1985.         neg edx
  1986.         cmp edx, ebx
  1987.         jg tdbDone              ; bitmap is off screen if -x > width
  1988.         mov xOffset, edx        ; store the offset
  1989.         neg edx                 ; back to negative...
  1990.         add nWidth, edx
  1991.  
  1992.         jmp tdbCheckY
  1993.  
  1994. tdbYNeg:
  1995.         neg ecx
  1996.         cmp ecx, eax
  1997.         jge tdbDone              ; bitmap is off screen if -y > height
  1998.         ;neg ecx
  1999.         ;add ecx, eax
  2000.         sub nHeight, ecx
  2001.         inc ecx
  2002.  
  2003. tdbFixY:
  2004.         dec ecx
  2005.         cmp ecx, 0
  2006.         jle tdbContinue
  2007.         add dPos, 320           ; go to next line on screen
  2008.         add sPos, ebx           ; go to next line in source
  2009.         jmp tdbFixY
  2010.  
  2011. tdbContinue:
  2012.  
  2013.         mov ecx, [ebp].tdbY     ; recharge ecx
  2014.  
  2015.         cmp ecx, 200 ;
  2016.         jg tdbDone
  2017.  
  2018.         cmp edx, 320 ;
  2019.         jg tdbDone
  2020.  
  2021.         add ebx, edx
  2022.         cmp ebx, 320 ;
  2023.         jg tdbXTooBig
  2024.  
  2025. tdbCheckY2:
  2026.         add eax, ecx
  2027.         cmp eax, 200 ;
  2028.         ;cmp nHeight, 200
  2029.         jge tdbYTooBig
  2030.  
  2031.         jmp tdbClipDone
  2032.  
  2033. tdbXTooBig:
  2034.         mov nWidth, ebx
  2035.         cmp edx, 0
  2036.         jge tdbXPos
  2037.  
  2038.         cmp nWidth, 320
  2039.         jl tdbClipDone
  2040.         mov nWidth, 320
  2041.         jmp tdbCheckY2
  2042.  
  2043.         ;mov ebx, 320
  2044.         ;sub ebx, edx
  2045.         ;cmp ebx, 320
  2046.         ;jl tdbXTooBig2
  2047.         ;mov ebx, 320
  2048.  
  2049. tdbXPos:
  2050.         mov ebx, 320
  2051.         sub ebx, edx
  2052.         mov nWidth, ebx
  2053.         jmp tdbCheckY2
  2054.  
  2055. tdbXTooBig2:
  2056.         ;mov nWidth, ebx
  2057.         ;jmp tdbCheckY2
  2058.  
  2059.         ;sub edx, 320 ;
  2060.         ;sub ebx, edx            ; get new 'width'
  2061.         ;mov nWidth, ebx
  2062.         ;jmp tdbCheckY2
  2063.  
  2064. tdbYTooBig:
  2065.         cmp ecx, 0
  2066.         jge tdbYPos
  2067.  
  2068.         cmp nHeight, 200
  2069.         jl tdbClipDone
  2070.         mov nHeight, 200
  2071.         jmp tdbClipDone
  2072.         ;cmp eax, 0
  2073.         ;jg tdbYTooBigPos
  2074.         ;mov eax, 200
  2075.         ;sub eax, ecx
  2076.         ;cmp eax, 200
  2077.         ;jl tdbYTooBig3
  2078.         ;mov eax, 200
  2079.         ;jmp tdbYTooBig3
  2080.  
  2081. tdbYPos:
  2082.         mov eax, 200
  2083.         sub eax, ecx
  2084.         mov nHeight, eax
  2085.         jmp tdbClipDone
  2086.  
  2087.  
  2088. tdbYTooBig3:
  2089.         ;mov nHeight, eax
  2090.         ;jmp tdbClipDone
  2091.  
  2092.         ;sub ecx, 200 ;
  2093.         ;sub eax, ecx            ; get new 'height'
  2094.         ;mov nHeight, eax
  2095.         ;jmp tdbClipDone
  2096.  
  2097. tdbClipDone:
  2098.  
  2099.         mov ecx, nHeight            ; get 'height'
  2100.         cld
  2101.         mov edx, xOffset
  2102.         add sPos, edx
  2103.         add dPos, edx
  2104.  
  2105.         align 4
  2106.  
  2107. tdbDrawLoop:
  2108.         mov esi, [ebp].tdbImage
  2109.         add esi, sPos
  2110.  
  2111.         mov edi, curPage
  2112.         add edi, dPos
  2113.  
  2114.         mov ebx, ecx
  2115.         mov ecx, nWidth
  2116.         mov edx, xOffset
  2117.         ;sub ecx, edx
  2118.  
  2119.         align 4
  2120.  
  2121. tdbRowLoop:
  2122.  
  2123.         cmp ecx, 4
  2124.         jl tdbMod
  2125.  
  2126.         lodsd
  2127.  
  2128.         test al, 0FFh
  2129.         jz tdbPix2
  2130.         stosb
  2131.         dec edi
  2132.  
  2133. tdbPix2:
  2134.         inc edi
  2135.         shr eax, 8
  2136.         test al, 0FFh
  2137.         jz tdbPix3
  2138.         stosb
  2139.         dec edi
  2140.  
  2141. tdbPix3:
  2142.         inc edi
  2143.         shr eax, 8
  2144.         test al, 0FFh
  2145.         jz tdbPix4
  2146.         stosb
  2147.         dec edi
  2148.  
  2149. tdbPix4:
  2150.         inc edi
  2151.         shr eax, 8
  2152.         test al, 0FFh
  2153.         jz tdbNextDW
  2154.         stosb
  2155.         dec edi
  2156.  
  2157. tdbNextDW:
  2158.         inc edi
  2159.         sub ecx, 4
  2160.         jmp tdbRowLoop
  2161.  
  2162. tdbMod:
  2163.         jecxz tdbRowDone
  2164.         lodsb
  2165.         test al, 0FFh
  2166.         jz tdbMod2
  2167.         stosb
  2168.         dec edi
  2169.  
  2170. tdbMod2:
  2171.         inc edi
  2172.         dec ecx
  2173.         jecxz tdbRowDone
  2174.         lodsb
  2175.         test al, 0FFh
  2176.         jz tdbMod3
  2177.         stosb
  2178.         dec edi
  2179.  
  2180. tdbMod3:
  2181.         inc edi
  2182.         dec ecx
  2183.         jecxz tdbRowDone
  2184.         lodsb
  2185.         test al, 0FFh
  2186.         jz tdbRowDone
  2187.         stosb
  2188.         dec edi
  2189.  
  2190. tdbRowDone:
  2191.         inc edi
  2192.         mov ecx, ebx
  2193.         dec ecx
  2194.         mov ebx, oWidth
  2195.         add sPos, ebx
  2196.         add dPos, 320
  2197. ;        mov ebx, xOffset
  2198. ;        add dPos, ebx
  2199. ;        add sPos, ebx
  2200.  
  2201.         cmp ecx, 0
  2202.         jle tdbDone
  2203.  
  2204.         ;jecxz tdbDone
  2205.         jmp tdbDrawLoop
  2206.  
  2207. tdbDone:
  2208.  
  2209.         pop ebp
  2210.         pop esi
  2211.         pop edi
  2212.  
  2213.         ret 20
  2214.  
  2215.  
  2216. tDrawBitmap endp
  2217.  
  2218.  
  2219. ;-------------------------------------------------------------------
  2220. ; void drawBitmap(char *image, int x, int y, int width, int height);
  2221. ;-------------------------------------------------------------------
  2222. ;       
  2223. ; draws a bitmap to the screen.  Full clipping once again...
  2224. ;
  2225.  
  2226.  
  2227. dbStack STRUC
  2228.  
  2229.                         dd  ?,?,?       ; ebp, esi, edi
  2230.                         dd  ?           ; caller
  2231.         dbHeight       dd  ?
  2232.         dbWidth        dd  ?
  2233.         dbY            dd  ?
  2234.         dbX            dd  ?
  2235.         dbImage        dd  ?
  2236.  
  2237. dbStack ENDS
  2238.  
  2239.         public drawBitmap
  2240.  
  2241. drawBitmap proc
  2242.  
  2243.         push edi
  2244.         push esi
  2245.         push ebp
  2246.  
  2247.         mov ebp, esp
  2248.  
  2249.         mov eax, 0
  2250.         mov sPos, eax
  2251.         mov xOffset, 0
  2252.         mov yOffset, 0
  2253.  
  2254.         mov esi, [ebp].dbImage
  2255.         mov edi, curPage
  2256.         mov ecx, [ebp].dbY
  2257.         mov eax, 320
  2258.         mul ecx
  2259.         mov edx, [ebp].dbX
  2260.         add eax, edx
  2261.         mov dPos, eax
  2262.  
  2263.         mov ebx, [ebp].dbWidth
  2264.         mov eax, [ebp].dbHeight
  2265.         mov oWidth, ebx
  2266.         mov nWidth, ebx
  2267.         mov oHeight, eax
  2268.         mov nHeight, eax
  2269.  
  2270.         ; clipping action...
  2271.  
  2272.         cmp edx, 0
  2273.         jl dbXNeg
  2274.  
  2275. dbCheckY:
  2276.         cmp ecx, 0
  2277.         jl dbYNeg
  2278.  
  2279.         jmp dbContinue
  2280.  
  2281. dbXNeg:
  2282.         neg edx
  2283.         cmp edx, ebx
  2284.         jg dbDone              ; bitmap is off screen if -x > width
  2285.         mov xOffset, edx        ; store the offset
  2286.         neg edx                 ; back to negative...
  2287.         add nWidth, edx
  2288.  
  2289.         jmp dbCheckY
  2290.  
  2291. dbYNeg:
  2292.         neg ecx
  2293.         cmp ecx, eax
  2294.         jge dbDone              ; bitmap is off screen if -y > height
  2295.         ;neg ecx
  2296.         ;add ecx, eax
  2297.         sub nHeight, ecx
  2298.         inc ecx
  2299.  
  2300. dbFixY:
  2301.         dec ecx
  2302.         cmp ecx, 0
  2303.         jle dbContinue
  2304.         add dPos, 320           ; go to next line on screen
  2305.         add sPos, ebx           ; go to next line in source
  2306.         jmp dbFixY
  2307.  
  2308. dbContinue:
  2309.  
  2310.         mov ecx, [ebp].dbY     ; recharge ecx
  2311.  
  2312.         cmp ecx, 200 ;
  2313.         jg dbDone
  2314.  
  2315.         cmp edx, 320 ;
  2316.         jg dbDone
  2317.  
  2318.         add ebx, edx
  2319.         cmp ebx, 320 ;
  2320.         jg dbXTooBig
  2321.  
  2322. dbCheckY2:
  2323.         add eax, ecx
  2324.         cmp eax, 200 ;
  2325.         ;cmp nHeight, 200
  2326.         jge dbYTooBig
  2327.  
  2328.         jmp dbClipDone
  2329.  
  2330. dbXTooBig:
  2331.         mov nWidth, ebx
  2332.         cmp edx, 0
  2333.         jge dbXPos
  2334.  
  2335.         cmp nWidth, 320
  2336.         jl dbClipDone
  2337.         mov nWidth, 320
  2338.         jmp dbCheckY2
  2339.  
  2340.         ;mov ebx, 320
  2341.         ;sub ebx, edx
  2342.         ;cmp ebx, 320
  2343.         ;jl dbXTooBig2
  2344.         ;mov ebx, 320
  2345.  
  2346. dbXPos:
  2347.         mov ebx, 320
  2348.         sub ebx, edx
  2349.         mov nWidth, ebx
  2350.         jmp dbCheckY2
  2351.  
  2352. dbXTooBig2:
  2353.         ;mov nWidth, ebx
  2354.         ;jmp dbCheckY2
  2355.  
  2356.         ;sub edx, 320 ;
  2357.         ;sub ebx, edx            ; get new 'width'
  2358.         ;mov nWidth, ebx
  2359.         ;jmp dbCheckY2
  2360.  
  2361. dbYTooBig:
  2362.         cmp ecx, 0
  2363.         jge dbYPos
  2364.  
  2365.         cmp nHeight, 200
  2366.         jl dbClipDone
  2367.         mov nHeight, 200
  2368.         jmp dbclipDone
  2369.         ;cmp eax, 0
  2370.         ;jg dbYTooBigPos
  2371.         ;mov eax, 200
  2372.         ;sub eax, ecx
  2373.         ;cmp eax, 200
  2374.         ;jl dbYTooBig3
  2375.         ;mov eax, 200
  2376.         ;jmp dbYTooBig3
  2377.  
  2378. dbYPos:
  2379.         mov eax, 200
  2380.         sub eax, ecx
  2381.         mov nHeight, eax
  2382.         jmp dbclipDone
  2383.  
  2384.  
  2385. dbYTooBig3:
  2386.         ;mov nHeight, eax
  2387.         ;jmp dbClipDone
  2388.  
  2389.         ;sub ecx, 200 ;
  2390.         ;sub eax, ecx            ; get new 'height'
  2391.         ;mov nHeight, eax
  2392.         ;jmp dbClipDone
  2393.  
  2394. dbClipDone:
  2395.  
  2396.         mov ecx, nHeight            ; get 'height'
  2397.         cld
  2398.         mov edx, xOffset
  2399.         add sPos, edx
  2400.         add dPos, edx
  2401.  
  2402.         align 4
  2403.  
  2404. dbDrawLoop:
  2405.         mov esi, [ebp].dbImage
  2406.         add esi, sPos
  2407.  
  2408.         mov edi, curPage
  2409.         add edi, dPos
  2410.  
  2411.         mov ebx, ecx
  2412.         mov ecx, nWidth
  2413.         mov edx, xOffset
  2414.         ;sub ecx, edx
  2415.  
  2416. dbRowLoop:
  2417.  
  2418.         mov edx, ecx
  2419.         shr ecx, 2
  2420.         and edx, 3
  2421.  
  2422.         cmp ecx, 0
  2423.         jle dbMod
  2424.  
  2425.         rep movsd
  2426.  
  2427. dbMod:
  2428.         mov ecx, edx
  2429.         rep movsb
  2430.  
  2431.  
  2432. dbRowDone:
  2433.         mov ecx, ebx
  2434.         dec ecx
  2435.         mov ebx, oWidth
  2436.         add sPos, ebx
  2437.         add dPos, 320
  2438. ;        mov ebx, xOffset
  2439. ;        add dPos, ebx
  2440. ;        add sPos, ebx
  2441.  
  2442.         cmp ecx, 0
  2443.         jle dbDone
  2444.  
  2445.         ;jecxz dbDone
  2446.         jmp dbDrawLoop
  2447.  
  2448. dbDone:
  2449.  
  2450.         pop ebp
  2451.         pop esi
  2452.         pop edi
  2453.  
  2454.         ret 20
  2455.  
  2456.  
  2457. drawBitmap endp
  2458.  
  2459.  
  2460.         end             ; end of code (the ONLY) segment
  2461.  
  2462.